package com.xuanzheng.company.service;

import com.xuanzheng.company.entity.CompanyEmployee;
import java.math.BigDecimal;
import java.util.List;

public interface CompanyEmployeeService {
    /**
     * 提交入职申请
     * @param companyEmployee 入职申请对象
     * @return 是否提交成功
     */
    boolean submitApplication(CompanyEmployee companyEmployee);
    
    /**
     * 审核入职申请
     * @param id 申请ID
     * @param status 新状态
     * @param position 职位（如果通过）
     * @param baseSalary 基础薪资（如果通过）
     * @param rejectReason 拒绝原因（如果拒绝）
     * @return 是否审核成功
     */
    boolean reviewApplication(String id, int status, String position, BigDecimal baseSalary, String rejectReason);
    
    /**
     * 根据ID获取入职申请
     * @param id 申请ID
     * @return 入职申请对象
     */
    CompanyEmployee getApplicationById(String id);
    
    /**
     * 获取用户最新的入职申请
     * @param userId 用户ID
     * @return 入职申请对象
     */
    CompanyEmployee getUserLatestApplication(String userId);
    
    /**
     * 根据用户ID获取该用户的所有入职申请
     * @param userId 用户ID
     * @return 入职申请列表
     */
    List<CompanyEmployee> getApplicationsByUserId(String userId);
    
    /**
     * 根据公司ID获取该公司的所有入职申请
     * @param companyId 公司ID
     * @return 入职申请列表
     */
    List<CompanyEmployee> getApplicationsByCompanyId(String companyId);
    
    /**
     * 根据公司ID和状态获取申请列表
     * @param companyId 公司ID
     * @param status 状态
     * @return 入职申请列表
     */
    List<CompanyEmployee> getApplicationsByCompanyIdAndStatus(String companyId, int status);
    
    /**
     * 获取用户在特定公司的申请记录
     * @param userId 用户ID
     * @param companyId 公司ID
     * @return 入职申请对象
     */
    CompanyEmployee getApplicationByUserIdAndCompanyId(String userId, String companyId);
    
    /**
     * 检查用户是否有权限使用功能
     * @param userId 用户ID
     * @return 如果已加入公司返回true，否则返回false
     */
    boolean canUseFeatures(String userId);
    
    /**
     * 获取公司所有员工列表
     * @param companyId 公司ID
     * @return 员工列表
     */
    List<CompanyEmployee> getEmployeesByCompanyId(String companyId);
    
    /**
     * 根据条件搜索公司员工
     * @param companyId 公司ID
     * @param keyword 搜索关键词（员工ID、姓名、电话、职位）
     * @return 匹配的员工列表
     */
    List<CompanyEmployee> searchEmployees(String companyId, String keyword);
    
    /**
     * 获取员工详细信息
     * @param id 员工申请ID
     * @return 员工详细信息
     */
    CompanyEmployee getEmployeeDetail(String id);
    
    /**
     * 更新员工信息（职位和薪资）
     * @param id 员工申请ID
     * @param position 新职位
     * @param baseSalary 新薪资
     * @return 是否更新成功
     */
    boolean updateEmployeeInfo(String id, String position, BigDecimal baseSalary);
    
    /**
     * 开除员工
     * @param id 员工申请ID
     * @return 是否开除成功
     */
    boolean fireEmployee(String id);

    /**
     * 根据用户ID获取员工信息（已加入公司的）
     * @param userId 用户ID
     * @return 员工信息
     */
    CompanyEmployee getByUserId(String userId);
    
    /**
     * 统计公司员工数量
     * @param companyId 公司ID
     * @return 员工数量
     */
    int countEmployeesByCompanyId(String companyId);
    
    /**
     * 获取公司所有员工（任务派遣用）
     * @param companyId 公司ID
     * @return 员工列表
     */
    List<CompanyEmployee> getCompanyEmployees(String companyId);
    
    /**
     * 搜索公司员工（任务派遣用）
     * @param companyId 公司ID
     * @param keyword 搜索关键词
     * @return 匹配的员工列表
     */
    List<CompanyEmployee> searchCompanyEmployees(String companyId, String keyword);

    /**
     * 提交离职申请
     * @param userId 用户ID
     * @param reason 离职原因
     * @return 是否提交成功
     */
    boolean submitResignation(String userId, String reason);
    
    /**
     * 审核离职申请
     * @param id 员工记录ID
     * @param status 新状态(1-拒绝离职(保持在职), 4-批准离职)
     * @return 是否审核成功
     */
    boolean reviewResignation(String id, int status);
    
    /**
     * 根据用户ID获取该用户的离职申请
     * @param userId 用户ID
     * @return 离职申请
     */
    CompanyEmployee getUserResignation(String userId);
    
    /**
     * 根据公司ID获取该公司的所有离职申请
     * @param companyId 公司ID
     * @return 离职申请列表
     */
    List<CompanyEmployee> getResignationsByCompanyId(String companyId);
    
    /**
     * 移除用户与所有公司的关联关系
     * @param userId 用户ID
     * @return 是否操作成功
     */
    boolean removeAllCompanyRelations(String userId);
} 